﻿// first_ffmpeg.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;

extern "C" { //指定函数是C语言函数，函数名不包含重载标注
//引用ffmpeg头文件
#include <libavcodec/avcodec.h>
}


//预处理指令导入库
#pragma comment(lib, "avcodec.lib")
#pragma comment(lib, "avutil.lib")

int main()
{
    cout << "first ffmpeg" << endl;
    cout << avcodec_configuration() << endl;

    //创建frame对象
    //只是申请了对象的空间，存储的空间并没有申请
    auto frame1 = av_frame_alloc();

    //图像参数
    frame1->width = 401;
    frame1->height = 300;
    frame1->format = AV_PIX_FMT_ARGB;

    //分配空间
    int re = av_frame_get_buffer(frame1, 0);
    if (re != 0)
    {
        char buf[1024] = { 0 };
        av_strerror(re, buf, sizeof(buf));
        cout << buf << endl;
    }

    //cout << "frame1->width = " << frame1->width << endl;
    //cout << "frame1->linesize[0] = " << frame1->linesize[0] << endl;
    if (frame1->buf[0])
    {
        cout << "frame1 ref count = " <<
            av_buffer_get_ref_count(frame1->buf[0]);
        cout << endl;
    }

    auto frame2 = av_frame_alloc();
    av_frame_ref(frame2, frame1);
    cout << "frame1 ref count = " <<
        av_buffer_get_ref_count(frame1->buf[0]) << endl;
    cout << "frame2 ref count = " <<
        av_buffer_get_ref_count(frame2->buf[0]) << endl;
    // 引用计数 2

    av_frame_unref(frame2);
    cout << "av_frame_unref(frame2)" << endl;
    cout << "frame1 ref count = " <<
        av_buffer_get_ref_count(frame1->buf[0]) << endl;

    //av_frame_unref判断引用计数为1
    //直接删除buffer空间，引用计数变为0
    av_frame_unref(frame1);

    //释放frame对象空间，buffer的引用计数-1
    //buffer已经为空，只删除frame对象空间
    av_frame_free(&frame1);
    av_frame_free(&frame2);
    return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
